﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;

namespace FeiYang
{
    public enum 物品设置_
    {
        极品_ = 1,
        贵重_,
        普通_,
        不拾取_,
    }
    public class 设置窗口_
    {
        public 设置窗口_(挂机人物_ 人物)
        {
            this.人物 = 人物;
        }
        public 挂机人物_ 人物 { get; private set; }

        public bool 展开设置菜单()
        {
            var 找到 = 其他_.循环判断(() => 图像_.查找文字("退出", 1049, 641, 1085, 661).X != -1, 2);
            if (!找到)
            {
                键鼠_.左键单击(1241, 351);
                其他_.延迟(其他_.时长_1000);
                找到 = 其他_.循环判断(() => 图像_.查找文字("退出", 1049, 641, 1085, 661).X != -1, 2);
                if (!找到) throw new Exception("点击设置失败");
            }
            return 找到;
        }
        public bool 打开设置选项窗口()
        {
            if (!设置窗口是打开的())
            {
                展开设置菜单();
                键鼠_.左键单击(1069, 543);
                var 找到 = 其他_.循环判断(() => 图像_.查找文字("操作体验", 599, 138, 688, 162).X != -1, 2);
                if (!找到) throw new Exception("打开设置选项窗口失败");
            }
            return true;
        }

        public bool 关闭设置选项窗口(bool 不收缩菜单 = false)
        {
            if (设置窗口是打开的())
            {
                键鼠_.左键单击(1099, 95);
                var 关闭了 = 设置窗口是关闭的();
                if (!关闭了) throw new Exception("关闭设置选项窗口失败");
            }
            if (!不收缩菜单)
            {
                收回设置菜单();
            }
            return true;
        }

        public bool 设置窗口是打开的()
        {
            return 其他_.循环判断(() => 图像_.查找文字("设", 1129, 133, 1156, 157).X != -1 &&
                图像_.查找文字("系", 1129, 222, 1156, 246).X != -1 &&
                图像_.查找文字("战", 1129, 310, 1156, 334).X != -1 &&
                图像_.查找文字("拾", 1129, 396, 1156, 420).X != -1 &&
                图像_.查找文字("怪", 1129, 483, 1156, 507).X != -1, 2);
        }
        public bool 设置窗口是关闭的()
        {
            return 其他_.循环判断(() => 图像_.查找文字("设", 1129, 133, 1156, 157).X == -1 ||
                图像_.查找文字("系", 1129, 222, 1156, 246).X == -1 ||
                图像_.查找文字("战", 1129, 310, 1156, 334).X == -1 ||
                图像_.查找文字("拾", 1129, 396, 1156, 420).X == -1 ||
                图像_.查找文字("怪", 1129, 483, 1156, 507).X == -1, 2);
        }

        public bool 收回设置菜单()
        {
            var 找到 = 其他_.循环判断(() => 图像_.查找文字("退出", 1049, 641, 1085, 661).X == -1, 2);
            if (!找到)
            {
                键鼠_.左键单击(1241, 351);
                其他_.延迟(其他_.时长_1000);
                找到 = 其他_.循环判断(() => 图像_.查找文字("退出", 1049, 641, 1085, 661).X == -1, 2);
                if (!找到) throw new Exception("点击关闭设置失败");
            }
            return 找到;
        }

        public bool 打开拾取设置()
        {
            打开设置选项窗口();
            键鼠_.左键单击(1142, 422);
            var 找到 = 其他_.循环判断(() => 图像_.查找文字("详细信息", 936, 127, 1021, 153).X != -1, 2);
            if (!找到) throw new Exception("打开拾取设置失败");
            return 找到;
        }

        public bool 小退操作()
        {
            展开设置菜单();
            键鼠_.左键单击(1065, 610);
            return 其他_.循环判断(() => UI_.找到确定登陆按钮().X != -1, 5);
        }

        public bool 确保游戏基本设置正确(bool 不关闭窗口 = false, bool 不收缩菜单 = false)
        {
            // 关闭
            Rectangle 高帧模式 = Rectangle.FromLTRB(854, 182, 873, 208);
            // 开启
            Rectangle 屏蔽特效 = Rectangle.FromLTRB(854, 235, 873, 261);
            // 关闭
            Rectangle 屏蔽玩家 = Rectangle.FromLTRB(854, 288, 873, 314);
            // 开启
            Rectangle 屏蔽怪物 = Rectangle.FromLTRB(854, 341, 873, 367);
            Rectangle 屏蔽宝宝 = Rectangle.FromLTRB(854, 394, 873, 420);
            Rectangle 屏蔽摊位 = Rectangle.FromLTRB(854, 447, 873, 473);
            // 关闭
            Rectangle 屏蔽己方 = Rectangle.FromLTRB(854, 500, 873, 536);

            打开设置选项窗口();
#if _调试_
            键鼠_.移动鼠标(其他_.取中心(高帧模式));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 高帧模式).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(高帧模式));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 高帧模式).X != -1), 3, 200);
            }

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(屏蔽特效));
#endif
            if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 屏蔽特效).X != -1), 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(屏蔽特效));
                其他_.循环判断(() => 图像_.屏幕找色("37A242", 屏蔽特效).X != -1, 3, 200);
            }

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(屏蔽玩家));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 屏蔽玩家).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(屏蔽玩家));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 屏蔽玩家).X != -1), 3, 200);
            }


#if _调试_
            键鼠_.移动鼠标(其他_.取中心(屏蔽怪物));
#endif
            if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 屏蔽怪物).X != -1), 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(屏蔽怪物));
                其他_.循环判断(() => 图像_.屏幕找色("37A242", 屏蔽怪物).X != -1, 3, 200);
            }


#if _调试_
            键鼠_.移动鼠标(其他_.取中心(屏蔽宝宝));
#endif
            if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 屏蔽宝宝).X != -1), 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(屏蔽宝宝));
                其他_.循环判断(() => 图像_.屏幕找色("37A242", 屏蔽宝宝).X != -1, 3, 200);
            }


#if _调试_
            键鼠_.移动鼠标(其他_.取中心(屏蔽摊位));
#endif
            if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 屏蔽摊位).X != -1), 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(屏蔽摊位));
                其他_.循环判断(() => 图像_.屏幕找色("37A242", 屏蔽摊位).X != -1, 3, 200);
            }
#if _调试_
            键鼠_.移动鼠标(其他_.取中心(屏蔽己方));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 屏蔽己方).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(屏蔽己方));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 屏蔽己方).X != -1), 3, 200);
            }

            // 开启
            Rectangle 玩家姓名_1 = Rectangle.FromLTRB(225, 182, 251, 208);
            Rectangle 怪物血条_2 = Rectangle.FromLTRB(225, 235, 251, 261);
            Rectangle 突出自己_3 = Rectangle.FromLTRB(225, 288, 251, 314);
            Rectangle 突出队友_4 = Rectangle.FromLTRB(225, 341, 251, 367);
            // 关闭
            Rectangle 显示顶戴_5 = Rectangle.FromLTRB(225, 394, 251, 420);
            Rectangle 显示称号_6 = Rectangle.FromLTRB(225, 447, 251, 473);
            Rectangle 显示极品属性_7 = Rectangle.FromLTRB(225, 500, 251, 536);
            Rectangle 隐藏自己名字_8 = Rectangle.FromLTRB(225, 553, 251, 579);
            Rectangle 隐藏自己称号_9 = Rectangle.FromLTRB(225, 606, 251, 632);

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(玩家姓名_1));
#endif
            if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 玩家姓名_1).X != -1), 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(玩家姓名_1));
                其他_.循环判断(() => 图像_.屏幕找色("37A242", 玩家姓名_1).X != -1, 3, 200);
            }

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(怪物血条_2));
#endif
            if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 怪物血条_2).X != -1), 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(怪物血条_2));
                其他_.循环判断(() => 图像_.屏幕找色("37A242", 怪物血条_2).X != -1, 3, 200);
            }

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(突出自己_3));
#endif
            if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 突出自己_3).X != -1), 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(突出自己_3));
                其他_.循环判断(() => 图像_.屏幕找色("37A242", 突出自己_3).X != -1, 3, 200);
            }

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(突出队友_4));
#endif
            if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 突出队友_4).X != -1), 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(突出队友_4));
                其他_.循环判断(() => 图像_.屏幕找色("37A242", 突出队友_4).X != -1, 3, 200);
            }

#if _调试_
            // 关闭
            键鼠_.移动鼠标(其他_.取中心(显示顶戴_5));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 显示顶戴_5).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(显示顶戴_5));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 显示顶戴_5).X != -1), 3, 200);
            }
#if _调试_
            键鼠_.移动鼠标(其他_.取中心(显示称号_6));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 显示称号_6).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(显示称号_6));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 显示称号_6).X != -1), 3, 200);
            }
#if _调试_
            键鼠_.移动鼠标(其他_.取中心(显示极品属性_7));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 显示极品属性_7).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(显示极品属性_7));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 显示极品属性_7).X != -1), 3, 200);
            }
#if _调试_
            键鼠_.移动鼠标(其他_.取中心(隐藏自己名字_8));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 隐藏自己名字_8).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(隐藏自己名字_8));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 隐藏自己名字_8).X != -1), 3, 200);
            }
#if _调试_
            键鼠_.移动鼠标(其他_.取中心(隐藏自己称号_9));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 隐藏自己称号_9).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(隐藏自己称号_9));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 隐藏自己称号_9).X != -1), 3, 200);
            }

            // 关闭
            Rectangle 单摇杆_1 = Rectangle.FromLTRB(538, 182, 564, 208);
            // 打开
            Rectangle 固定摇杆_2 = Rectangle.FromLTRB(538, 235, 564, 261);
            Rectangle 屏幕跑_3 = Rectangle.FromLTRB(538, 288, 564, 314);
            // 关闭
            Rectangle 残血_4 = Rectangle.FromLTRB(538, 341, 564, 367);
            Rectangle 持久警告_5 = Rectangle.FromLTRB(538, 394, 564, 420);
            // 打开
            Rectangle 自动修理_6 = Rectangle.FromLTRB(538, 447, 564, 473);
            Rectangle 自动关窗口_7 = Rectangle.FromLTRB(538, 500, 564, 536);
            // 关闭
            Rectangle 屏蔽屏幕移动_8 = Rectangle.FromLTRB(538, 553, 564, 579);
            Rectangle 滑杆取消战斗_9 = Rectangle.FromLTRB(538, 606, 564, 632);

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(单摇杆_1));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 单摇杆_1).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(单摇杆_1));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 单摇杆_1).X != -1), 3, 200);
            }

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(固定摇杆_2));
#endif
            if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 固定摇杆_2).X != -1), 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(固定摇杆_2));
                其他_.循环判断(() => 图像_.屏幕找色("37A242", 固定摇杆_2).X != -1, 3, 200);
            }

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(屏幕跑_3));
#endif
            if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 屏幕跑_3).X != -1), 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(屏幕跑_3));
                其他_.循环判断(() => 图像_.屏幕找色("37A242", 屏幕跑_3).X != -1, 3, 200);
            }

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(残血_4));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 残血_4).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(残血_4));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 残血_4).X != -1), 3, 200);
            }

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(持久警告_5));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 残血_4).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(持久警告_5));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 持久警告_5).X != -1), 3, 200);
            }
#if _调试_
            // 打开
            键鼠_.移动鼠标(其他_.取中心(自动修理_6));
#endif
            if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 自动修理_6).X != -1), 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(自动修理_6));
                其他_.循环判断(() => 图像_.屏幕找色("37A242", 自动修理_6).X != -1, 3, 200);
            }

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(自动关窗口_7));
#endif
            if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 自动关窗口_7).X != -1), 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(自动关窗口_7));
                其他_.循环判断(() => 图像_.屏幕找色("37A242", 自动关窗口_7).X != -1, 3, 200);
            }

#if _调试_
            // 关闭
            键鼠_.移动鼠标(其他_.取中心(屏蔽屏幕移动_8));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 屏蔽屏幕移动_8).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(屏蔽屏幕移动_8));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 屏蔽屏幕移动_8).X != -1), 3, 200);
            }

#if _调试_
            键鼠_.移动鼠标(其他_.取中心(滑杆取消战斗_9));
#endif
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 滑杆取消战斗_9).X != -1, 3, 200))
            {
                键鼠_.左键单击(其他_.取中心(滑杆取消战斗_9));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 滑杆取消战斗_9).X != -1), 3, 200);
            }

            if (!不关闭窗口)
            {
                关闭设置选项窗口(不收缩菜单);
            }
            return true;
        }

        public bool 关闭极品拾取及自动捡物(bool 不关闭窗口 = false, bool 不收缩菜单 = false)
        {
            return 切换极品拾取及自动捡物(false, 不关闭窗口, 不收缩菜单);
        }

        public bool 开启极品拾取及自动捡物(bool 不关闭窗口 = false, bool 不收缩菜单 = false)
        {
            return 切换极品拾取及自动捡物(true, 不关闭窗口, 不收缩菜单);
        }

        private bool 切换极品拾取及自动捡物(bool 开启 = true, bool 不关闭窗口 = false, bool 不收缩菜单 = false)
        {
            打开拾取设置();
            // 打开
            Rectangle 极品拾取 = Rectangle.FromLTRB(790, 631, 816, 657);
            Rectangle 自动捡物 = Rectangle.FromLTRB(959, 631, 985, 657);
            if (开启)
            {
                if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 极品拾取).X != -1), 2))
                {
                    键鼠_.左键单击(其他_.取中心(极品拾取));
                    其他_.循环判断(() => 图像_.屏幕找色("37A242", 极品拾取).X != -1, 2);
                }
                if (其他_.循环判断(() => !(图像_.屏幕找色("37A242", 自动捡物).X != -1), 2))
                {
                    键鼠_.左键单击(其他_.取中心(自动捡物));
                    其他_.循环判断(() => 图像_.屏幕找色("37A242", 自动捡物).X != -1, 2);
                }
            }
            else
            {
                if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 极品拾取).X != -1, 2))
                {
                    键鼠_.左键单击(其他_.取中心(极品拾取));
                    其他_.循环判断(() => !(图像_.屏幕找色("37A242", 极品拾取).X != -1), 2);
                }
                if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 自动捡物).X != -1, 2))
                {
                    键鼠_.左键单击(其他_.取中心(自动捡物));
                    其他_.循环判断(() => !(图像_.屏幕找色("37A242", 自动捡物).X != -1), 2);
                }
            }

            // 关闭
            Rectangle 不拾取他人 = Rectangle.FromLTRB(790, 667, 816, 690);
            if (其他_.循环判断(() => 图像_.屏幕找色("37A242", 不拾取他人).X != -1, 2))
            {
                键鼠_.左键单击(其他_.取中心(不拾取他人));
                其他_.循环判断(() => !(图像_.屏幕找色("37A242", 不拾取他人).X != -1), 2);
            }

            if (!不关闭窗口)
            {
                关闭设置选项窗口(不收缩菜单);
            }
            return true;
        }

        public bool 设置物品为拾取(string 名称, 物品设置_ 设置, bool 不关闭窗口 = false, bool 不收缩菜单 = false)
        {
            打开拾取设置();
            键鼠_.左键单击(387, 665);
            其他_.延迟(其他_.时长_2000);
            键鼠_.输入文本(名称);
            其他_.延迟(其他_.时长_2000);
            var 输入成功 = 其他_.循环判断(() => 图像_.查找文字(名称, 269, 642, 523, 675).X != -1, 5);
            if (!输入成功) throw new Exception("输入成功");
            // 删除
            键鼠_.左键单击(725, 659);
            其他_.延迟(其他_.时长_2000);
            if (设置 != 物品设置_.不拾取_)
            {
                // 新增
                键鼠_.左键单击(613, 659);
                其他_.延迟(其他_.时长_2000);
                if (设置 != 物品设置_.极品_)
                {
                    其他_.延迟(其他_.时长_400);
                    键鼠_.移动鼠标(1060, 552);
                    其他_.延迟(其他_.时长_400);
                    键鼠_.滚动滚轮(-2);
                    其他_.延迟(其他_.时长_2000);
                    var 找到分组 = 其他_.循环判断(() => 图像_.查找文字("自定义分组", 272, 582, 379, 610).X != -1, 5);
                    if (!找到分组) throw new Exception("没找到新增分组");
                    // 取消极品
                    键鼠_.左键单击(460, 598);
                    其他_.延迟(其他_.时长_400);
                    if (设置 != 物品设置_.贵重_)
                    {
                        // 取消贵重
                        键鼠_.左键单击(594, 598);
                        其他_.延迟(其他_.时长_400);
                    }
                }
            }
            if (!不关闭窗口)
            {
                关闭设置选项窗口(不收缩菜单);
            }
            return true;
        }

        public bool 设置物品为不拾取(string 名称, bool 不关闭窗口 = false, bool 不收缩菜单 = false)
        {
            打开拾取设置();
            键鼠_.左键单击(387, 665);
            其他_.延迟(其他_.时长_2000);
            键鼠_.输入文本(名称);
            其他_.延迟(其他_.时长_2000);
            var 输入成功 = 其他_.循环判断(() => 图像_.查找文字(名称, 269, 642, 523, 675).X != -1, 5);
            if (!输入成功) throw new Exception("输入成功");
            // 删除
            键鼠_.左键单击(725, 659);
            其他_.延迟(其他_.时长_2000);
            if (!不关闭窗口)
            {
                关闭设置选项窗口(不收缩菜单);
            }
            return true;
        }
    }
}
